package pessoa;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;

import database.Database;
import excecoes.CpfCnpjInvalidoException;


/**
 * Esta classe e responsavel por manter os clientes, executando as operacoes de 
 *  cadastrar, excluir,alterar, pesquisar e recuperar-los
 * 
 */
public class RepositorioCliente {

	private Connection conexao;

	/**
	 * Esse construtor atribui uma conexao ao atributo conexao da classe
	 */
	public RepositorioCliente(){

		conexao = Database.getConexao();

	}

	/**
	 * Esse metodo deve cadastrar um cliente, registrando-o no banco de dados
	 * 
	 * @param cliente a ser cadastrado
	 */
	public void cadastrar(Cliente cliente){
		
		/*
		 * Se o fornecedor passado for null, lanca uma excecao
		 */
		if(cliente == null){
			throw new RuntimeException();
		}
		
		/*
		 * String contendo o comando o codigo sql q sera executado, os valores devem
		 * corresponder as colunas. Cada valor e marcado com uma ? e sera preenchido
		 * posteriormente pelos metodos set do statement
		 */
		String sql = "INSERT INTO cliente (cpf_cnpj, nome, endereco, email, telefone) VALUES (?,?,?,?,?);";

		try{

			PreparedStatement statement = conexao.prepareStatement(sql);

			/*
			 * Determina os valores que substituirao as ? no comando sql q sera executado
			 */
			statement.setString(1, cliente.getCpf_cnpj());
			statement.setString(2, cliente.getNome());
			statement.setString(3, cliente.getEndereco());
			statement.setString(4, cliente.getEmail());
			statement.setString(5, cliente.getTelefone());

			/*
			 * Executa e fecha o statemente
			 */
			statement.execute();
			statement.close();

		}catch (SQLException e) {

			e.printStackTrace();
			
			/*
			 * relanca a exececao como uma RuntimeException indicando onde ocorreu o erro
			 */
			throw new RuntimeException("Falha ao cadastrar cliente");

		}
	}//cadastrar(Cliente cliente)


	/**
	 * Esse metodo deve excluir um cliente, removendo-o do banco de dados.
	 * 
	 * Um cliente nao pode ser excluido se ele tiver alguma venda.
	 */
	public void excluir(){

	}

	/**
	 * Esse metodo deve atualizar os atributos de um cliente
	 * 
	 * Nao se deve alterar o codigo do produto
	 */
	public void atualizar(){

	}

	/**
	 * Esse metodo deve pesquisar um fornecedor no banco de dados e retorna-lo
	 * 
	 * @param cpf ou cnpj
	 * 
	 * @return Um objeto cliente
	 */
	public Cliente pesquisar(String cpf_cnpj){

		if(cpf_cnpj == null){
			throw new RuntimeException();
		}
		
		Cliente cliente = null;

		for(Cliente C : recuperarClientes()){
			
			if(C.getCpf_cnpj().equals(cpf_cnpj)){
				
				cliente = C;
				
			}
			
		}
		
		return cliente;

	}//pesquisar(String cpf_cnpj)


	/**
	 * Esse metodo deve retornar todos os fornecedores contidos no banco de dados
	 * 
	 * @return Arraylist<Forncedor> contendo todos os fornecedores cadastrados
	 */
	public ArrayList<Cliente> recuperarClientes(){

		ArrayList<Cliente> clientes = new ArrayList<>();

		try {

			String sql = "SELECT * FROM cliente;";
			
			PreparedStatement statement = conexao.prepareStatement(sql);
			
			ResultSet result = statement.executeQuery();

			/*
			 * recupera todos os dados da tabela, transfere para um objeto fornecedor
			 * e adiciona o objeto no arraylist
			 */
			while(result.next()){

				clientes.add(new Cliente(result.getString("cpf_cnpj"), result.getString("nome"),
						result.getString("endereco"), result.getString("email"),
						result.getString("telefone")));

			} 

			/*
			 * Fecha o ResultSet e o Statement
			 */
			result.close();
			statement.close();

		} catch (SQLException e) {

			e.printStackTrace();
			
			throw new RuntimeException("Falha ao recuperar clientes");

		} catch (CpfCnpjInvalidoException e) {
			
			e.printStackTrace();
		}

		return clientes;

	}//recuperarClientes()

}//RepositorioCliente
